package com.bzkj.document.mapper;

import com.bzkj.document.domain.purchaseinorder.dto.PurchaseInboundDTO;
import com.bzkj.document.domain.purchaseinorder.vo.PurchaseInboundBodyVO;
import com.bzkj.document.domain.purchaseinorder.vo.PurchaseInboundHeadVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @projectName: bzkj-wms
 * @package: com.bzkj.document.mapper
 * @className: PurchaseInStockMapper
 * @description: 采购入库单持久层
 * @author: C1309
 * @createDate: 2024年11月20日
 * @version: v1.0
 */
public interface PurchaseInStockMapper {
    /**
     * 插入采购入库单头信息
     *
     * @param purchaseInStockHeader 采购入库单头信息
     * @return 影响行数
     */
    int insertPurchaseInStockHeader(Map<String, Object> purchaseInStockHeader);

    /**
     * 插入采购入库单明细
     *
     * @param item 入库单明细
     * @return 影响行数
     */
    int insertPurchaseInStockDetails(Map<String, Object> item);

    /**
     * 查询采购入库单头信息
     *
     * @param purchaseInboundDTO 查询条件
     * @return 查询结果
     */
    List<PurchaseInboundHeadVO> selectPurchaseInStockHeader(PurchaseInboundDTO purchaseInboundDTO);

    /**
     * 查询采购入库单明细
     *
     * @param cgeneralhid 单据表头主键
     * @param billState  单据状态
     * @return 查询结果
     */
    List<PurchaseInboundBodyVO> selectPurchaseInStockDetails(@Param("cgeneralhid") String cgeneralhid,
                                                             @Param("billState") String billState);

    /**
     * 根据入库单号获取采购入库单头信息
     *
     * @param cgeneralhid 入库单表头
     * @return 查询结果
     */
    PurchaseInboundHeadVO selectPurchaseInHeaderByBillCode(String cgeneralhid);


    /**
     * 根据商品ID、批次号和药品编号获取WMS架位号
     *
     * @param skuId   商品ID
     * @param batchNo 批次号
     * @return WMS仓库ID
     */
    String getWmsJwh(@Param("skuId") String skuId, @Param("batchNo") String batchNo, @Param("wareHouseId") String wareHouseId);

    /**
     * 插入采购入库记录至库存上架
     *
     * @param wmsJwh      wms架位号
     * @param orderDetail 采购入库单明细
     * @return 影响行数
     */
    int addPurchaseInStockRecord(@Param("wmsJwh") String wmsJwh, @Param("detail") HashMap<String, Object> orderDetail);

    /**
     * 获取入库单状态
     *
     * @param headerId 入库单头ID
     * @return 查询结果
     */
    HashMap<String, String> getBillStatus(String headerId);

    /**
     * 更新单据状态
     *
     * @param cgeneralhid 单据号主键
     * @param billState   状态
     * @param userName    操作人
     * @param reason      删除原因
     * @return 影响行数
     */
    int updateBillState(@Param("cgeneralhid") String cgeneralhid,
                        @Param("billState") String billState,
                        @Param("userName") String userName,
                        @Param("reason") String reason);


    /**
     * 更新WMS入库单表头信息
     *
     * @param purchaseInStockHeader 入库单头信息
     * @return 更新结果
     */
    int updateWmsWarehouseInMaterial(Map<String, Object> purchaseInStockHeader);

    /**
     * 更新采购入库单明细
     *
     * @param purchaseInStockDetails 入库单明细
     * @return 更新结果
     */
    int updatePurchaseInStockDetails(Map<String, Object> purchaseInStockDetails);

    /**
     * 采购入库单回滚
     *
     * @param headerId 采购入库单表头主键
     * @param userName 登录用户id
     * @return 回滚结果
     */
    int orderBackHead(@Param("headerId") String headerId, @Param("userName") String userName);

    /**
     * 采购入库单明细回滚
     *
     * @param headerId 入库单号
     * @param userName 操作人
     * @return 操作结果
     */
    int orderBackDetails(@Param("headerId") String headerId, @Param("userName") String userName);

    /**
     * 根据采购入库单表头主键获取入库单号
     *
     * @param headerId 入库单表头主键
     * @return 查询结果
     */
    @Select("select vbillcode from wms_warehouse_in_material where cgeneralhid = #{headerId}")
    String selectVbillcodeByHeaderId(@Param("headerId") String headerId);
}
